<?php
/**
 * Created by ptmall
 * User : Jensen
 * Date : 2020/8/26
 * Time : 11:13
 */

namespace third;
use think\Db;
class WxSdk
{

    private $appId;
    private $appSecret;

    public function __construct($appId='', $appSecret='') {
        $this->appId = $appId;
        $this->appSecret = $appSecret;
    }


    public function islogin(){
        //验证是否登录过，如果没有登录就跳转
        if(empty(session('openid'))){
            // $this->getUserOpenId();
            return false;
            // $this->redirect('/index/index/me');
            // exit();
        }else{
            // echo " ";
            return true;
            // dump(session('openid'));
        }
    }

    public function login(){

        $user = $this->getUserOpenId();

        return $user;
    }


    public function getBaseInfo(){
        //1.获取到code

        // $redirect_uri=urlencode($this->domain()."/index/index/index");//跳转 可以自己改参数
        $redirect_uri=urlencode($this->domain()."/index/index/wxindex");

        $url="https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$this->appId."&redirect_uri=".$redirect_uri."&response_type=code&scope=snsapi_userinfo&state=xiaohe#wechat_redirect";

        echo '<script>;location.href="'.$url.'";</script>;';
        exit();
    }

    /**
     * 判断是否为https
     * @return bool 是https返回true;否则返回false
     */
    public function domain() {
        if ( !empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') {
            return 'https://'.$_SERVER['HTTP_HOST'];
        } elseif ( isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' ) {
            return 'https://'.$_SERVER['HTTP_HOST'];
        } elseif ( !empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off') {
            return 'https://'.$_SERVER['HTTP_HOST'];
        }else{
            return 'http://'.$_SERVER['HTTP_HOST'];
        }
    }

    //查询这个用户的信息
    public function openid_nickname($openid){
        $nickname = Db::name('wxuser')->where('openid',$openid)->find();
        return $nickname['nickname'];
    }

    //获取用户的openid等信息
    public function getUserOpenId(){
        if(!empty($_SERVER['HTTP_REFERER']))
            file_put_contents('tiaozhuan.txt', $_SERVER['HTTP_REFERER'].'\r\n',FILE_APPEND);
        // exit($_GET);
        //2.获取到网页授权的access_token


        // if(empty($this->request->get('code'))){
        if(empty($_GET['code'])){
            $this->getBaseInfo();
            exit();
        }

        $code = $_GET['code'];
        $url="https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$this->appId."&secret=".$this->appSecret."&code=".$code."&grant_type=authorization_code ";
        //3.拉取用户的openid
        $res = file_get_contents($url);

        $data = json_decode($res,true);
        if(!empty($data['access_token']) && !empty($data['openid'])){
            $this->access_token=$data['access_token'];
            $this->refresh_token=$data['refresh_token'];

            $url = "https://api.weixin.qq.com/sns/userinfo?access_token=".$data['access_token']."&openid=".$data['openid']."&lang=zh_CN";
            $userInfo = file_get_contents($url);
            $user_res = json_decode($userInfo,true);
            // echo $userInfo;
            return $user_res;
            //             $this->openid = $user_res['openid'];
            //             $this->nickname = base64_encode($user_res['nickname']);
            //             $this->headimgurl = $user_res['headimgurl'];
            //             $this->sex = $user_res['sex'];
            // // dump($user_res);
            //             //获取都用户信息然后判断是否新用户 存表
            //             session('openid',$this->openid);
            //                if(!empty($_SERVER['HTTP_REFERER'])){
            //                   $this->redirect($_SERVER['HTTP_REFERER']);
            //                }
            //                else{
            //                   $this->redirect($this->_domain.'/index/index/index');
            //                }

        }else{
            return($data);
            // $this->getUserOpenId();
            exit();
        }
    }

    public function getSignPackage() {
        $jsapiTicket = $this->getJsApiTicket();

        // 注意 URL 一定要动态获取，不能 hardcode.
        $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
        $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

        $timestamp = time();
        $nonceStr = $this->createNonceStr();

        // 这里参数的顺序要按照 key 值 ASCII 码升序排序
        $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";

        $signature = sha1($string);

        $signPackage = array(
            "appId"     => $this->appId,
            "nonceStr"  => $nonceStr,
            "timestamp" => $timestamp,
            "url"       => $url,
            "signature" => $signature,
            "rawString" => $string
        );
        return $signPackage;
    }

    private function createNonceStr($length = 16) {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }

    private function getJsApiTicket() {
        // jsapi_ticket 应该全局存储与更新，以下代码以写入到文件中做示例
        if(file_get_contents("jsapi_ticket.json")){
            $data = json_decode(file_get_contents("jsapi_ticket.json"));
        }else{
            $data = null;
        }


        if ($data->expire_time < time()) {
            $accessToken = $this->getAccessToken();
            // 如果是企业号用以下 URL 获取 ticket
            // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";
            $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
            $res = json_decode($this->httpGet($url));
            $ticket = $res->ticket;
            if ($ticket) {
                $data->expire_time = time() + 7000;
                $data->jsapi_ticket = $ticket;
                $fp = fopen("jsapi_ticket.json", "w");
                fwrite($fp, json_encode($data));
                fclose($fp);
            }
        } else {
            $ticket = $data->jsapi_ticket;
        }

        return $ticket;
    }

    private function getAccessToken() {
        // access_token 应该全局存储与更新，以下代码以写入到文件中做示例
        $data = json_decode(file_get_contents("access_token.json"));
        if ($data->expire_time < time()) {
            // 如果是企业号用以下URL获取access_token
            // $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret";
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
            $res = json_decode($this->httpGet($url));
            $access_token = $res->access_token;
            if ($access_token) {
                $data->expire_time = time() + 7000;
                $data->access_token = $access_token;
                $fp = fopen("access_token.json", "w");
                fwrite($fp, json_encode($data));
                fclose($fp);
            }
        } else {
            $access_token = $data->access_token;
        }
        return $access_token;
    }

    private function httpGet($url) {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 500);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_URL, $url);

        $res = curl_exec($curl);
        curl_close($curl);

        return $res;
    }


}